package manager.modulo.ferramenta.dao;

import java.sql.SQLException;
import manager.auxiliares.MensagemExcessao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.LinkedList;
import manager.auxiliares.Configurations;
import manager.auxiliares.Format;
import manager.principal.fonte.JanelaLogin;
import manager.interfaces.InterfaceDao;
import manager.modulo.ferramenta.enumerator.EnumSituacaoHistoricoFerramenta;
import manager.modulo.ferramenta.enumerator.EnumSituacaoHistoricoFerramenta.SituacaoHistoricoFerramenta;

/**
 * Esta classe será utilizada para cadastra a entidade user no banco de dados
 *
 * @author Thiago
 */
public class HistoricoFerramentaDao implements InterfaceDao {

    private int id;
    private Timestamp dtEntrega;
    private Timestamp dtPrevisaoDevolucao;
    private Timestamp dtDevolucao;
    private String justificativa;
    private String observacao;
    private SituacaoHistoricoFerramenta situacao;
    private int idFuncionario;

    /**
     * Inicializando as variáveis
     */
    public HistoricoFerramentaDao() {
        dtEntrega = new Timestamp(00 - 00 - 00);
        dtPrevisaoDevolucao = new Timestamp(00 - 00 - 00);
        dtDevolucao = new Timestamp(00 - 00 - 00);
        justificativa = "";
        observacao = "";
        situacao = SituacaoHistoricoFerramenta.NAOENCONTRADO;
        idFuncionario = 0;
    }

    public LinkedList<String> buscar(String opcao, String palavraBuscada, boolean limite) throws SQLException {
        LinkedList<String> result = new LinkedList<String>();
        if (!palavraBuscada.equals("")) {
            String sql = "";
            String tamanhoBusca = limite ? ("LIMIT 0," + Configurations.getAutoCompleteSizeSearch()) : "";
            if (opcao.equalsIgnoreCase("Funcionário")) {// Buscando por Nome
                sql = "SELECT tx_identificador FROM funcionario WHERE tx_identificador LIKE ? ORDER BY tx_identificador " + tamanhoBusca;
                palavraBuscada += "%";
            } else if (opcao.equalsIgnoreCase("Nome Ferramenta")) {
                sql = "SELECT tx_nome FROM ferramenta WHERE tx_nome LIKE ? ORDER BY tx_nome " + tamanhoBusca;
                palavraBuscada += "%";
            } else if (opcao.equalsIgnoreCase("Identificador Ferramenta")) {
                sql = "SELECT tx_identificador FROM ferramenta WHERE tx_identificador LIKE ? ORDER BY tx_identificador " + tamanhoBusca;
                palavraBuscada += "%";
            }
            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, palavraBuscada);
                ResultSet resultSet = preparedStatement.executeQuery();
                while (resultSet.next()) {
                    result.add(resultSet.getString(1));
                }
            }
        }
        return result;
    }

    public static LinkedList buscarTabela(String opcao, String palavraBuscada) throws SQLException {
        LinkedList result = new LinkedList();
        if (!palavraBuscada.equals("")) {
            String sql = "";
            if (opcao.equalsIgnoreCase("Funcionário")) { // Buscando por nome
                sql = "SELECT "
                        + " f.tx_identificador as Funcionario, "
                        + " hf.id as IdHistoricoFerramenta, "
                        + " hf.dt_entrega as DtEntrega, "
                        + " hf.dt_previsao_devolucao as DtPrevisaoDevolucao, "
                        + " hf.dt_devolucao as DtDevolucao, "
                        + " hf.cd_situacao as Situacao "
                        + "FROM "
                        + " historico_ferramenta hf "
                        + " INNER JOIN funcionario f ON f.id = hf.id_funcionario "
                        + "WHERE "
                        + " f.tx_identificador LIKE ? "
                        + "ORDER BY hf.cd_situacao, f.tx_identificador, hf.dt_previsao_devolucao ";
                palavraBuscada += "%";
            } else if (opcao.equalsIgnoreCase("Situação")) {
                sql = "SELECT "
                        + " f.tx_identificador as Funcionario, "
                        + " hf.id as IdHistoricoFerramenta, "
                        + " hf.dt_entrega as DtEntrega, "
                        + " hf.dt_previsao_devolucao as DtPrevisaoDevolucao, "
                        + " hf.dt_devolucao as DtDevolucao, "
                        + " hf.cd_situacao as Situacao "
                        + "FROM "
                        + " historico_ferramenta hf "
                        + " INNER JOIN funcionario f ON f.id = hf.id_funcionario "
                        + "WHERE "
                        + " hf.cd_situacao = ? "
                        + "ORDER BY hf.cd_situacao, f.tx_identificador, hf.dt_previsao_devolucao ";
                palavraBuscada = Integer.toString(EnumSituacaoHistoricoFerramenta.ConverterEnumNumero(EnumSituacaoHistoricoFerramenta.ConvertStringEnum(palavraBuscada)));

            }

            if (!sql.equals("")) {
                PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
                preparedStatement.setString(1, palavraBuscada);
                ResultSet resultSet = preparedStatement.executeQuery();

                LinkedList<String> colunaFuncionario = new LinkedList<String>();
                LinkedList<String> colunaDtEntrega = new LinkedList<String>();
                LinkedList<String> colunaDtPrevisaoDevolucao = new LinkedList<String>();
                LinkedList<String> colunaDevolucao = new LinkedList<String>();
                LinkedList<String> colunaSituacao = new LinkedList<String>();
                LinkedList<Integer> colunaId = new LinkedList<Integer>();

                while (resultSet.next()) {
                    colunaId.add(resultSet.getInt("IdHistoricoFerramenta"));
                    colunaFuncionario.add(resultSet.getString("Funcionario"));
                    colunaDtEntrega.add(resultSet.getTimestamp("DtEntrega") == null ? "" : Format.formatarTimeStampApresentacao(resultSet.getTimestamp("DtEntrega")));
                    colunaDtPrevisaoDevolucao.add(resultSet.getTimestamp("DtPrevisaoDevolucao") == null ? "" : Format.formatarTimeStampApresentacao(resultSet.getTimestamp("DtPrevisaoDevolucao")));
                    colunaDevolucao.add(resultSet.getTimestamp("DtDevolucao") == null ? "" : Format.formatarTimeStampApresentacao(resultSet.getTimestamp("DtDevolucao")));
                    colunaSituacao.add(EnumSituacaoHistoricoFerramenta.ConvertEnumString(EnumSituacaoHistoricoFerramenta.ConverterNumeroEnum(resultSet.getInt("Situacao"))));
                }

                result.add(colunaId);
                result.add(Format.getBooleanLinkedList(colunaId.size()));
                result.add(colunaFuncionario);
                result.add(colunaDtEntrega);
                result.add(colunaDtPrevisaoDevolucao);
                result.add(colunaDevolucao);
                result.add(colunaSituacao);
                result.add(Format.getBooleanLinkedList(colunaId.size()));
            }
        }
        return result;
    }

    /**
     * Carregar as informações do objeto usuário a partir de um id
     *
     * @param id Id do usuário buscado
     */
    public void buscar(int id) {
        try {
            setId(id);
            String sql = "SELECT * FROM historico_ferramenta WHERE id = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setInt(1, id);
            ResultSet resultSet = preparedStatement.executeQuery();
            if (resultSet.first()) {
                dtEntrega = resultSet.getTimestamp("dt_entrega");
                dtPrevisaoDevolucao = resultSet.getTimestamp("dt_previsao_devolucao");
                dtDevolucao = resultSet.getTimestamp("dt_devolucao");
                justificativa = resultSet.getString("tx_justificativa");
                observacao = resultSet.getString("tx_observacao");
                situacao = EnumSituacaoHistoricoFerramenta.ConverterNumeroEnum(resultSet.getInt("cd_situacao"));
                idFuncionario = resultSet.getInt("id_funcionario");
            }
            resultSet.close();
            preparedStatement.close();
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Histórico de Ferramentas");
        }
    }

    /**
     * Insere um usuário no banco
     */
    public void inserir() throws SQLException {
        String sql = "INSERT INTO historico_ferramenta "
                + "(dt_entrega,"
                + " dt_previsao_devolucao,"
                + " dt_devolucao,"
                + " tx_justificativa,"
                + " tx_observacao,"
                + " cd_situacao,"
                + " id_funcionario) "
                + "VALUES ("
                + "?," // 01 Dt Entreha
                + "?," // 02 Dt Previsão Devolucao
                + "?," // 03 Dt Devolução
                + "?," // 04 Justificativa
                + "?," // 05 Observação
                + "?," // 06 Situacao
                + "?)"; // 07 IdFuncionario
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);

        preparedStatement.setTimestamp(1, dtEntrega);
        preparedStatement.setTimestamp(2, dtPrevisaoDevolucao);
        preparedStatement.setTimestamp(3, dtDevolucao);
        preparedStatement.setString(4, justificativa);
        preparedStatement.setString(5, observacao);
        preparedStatement.setInt(6, EnumSituacaoHistoricoFerramenta.ConverterEnumNumero(situacao));
        preparedStatement.setInt(7, idFuncionario);

        preparedStatement.executeUpdate();

        //Recebendo o novo id gerado
        ResultSet resultSet = preparedStatement.getGeneratedKeys();
        while (resultSet.next()) {
            id = resultSet.getInt(1);
        }

        preparedStatement.close();
        resultSet.close();
    }

    /**
     * Atualiza o usuário no banco
     */
    public void atualizar() throws SQLException {
        String sql = "  UPDATE historico_ferramenta SET "
                + "     dt_entrega = ? ," // 01
                + "     dt_previsao_devolucao = ? ," // 02
                + "     dt_devolucao = ? ," // 03
                + "     tx_justificativa = ? ," // 04
                + "     tx_observacao = ? ," // 05
                + "     cd_situacao = ? ," // 06
                + "     id_funcionario = ? " // 07
                + " WHERE "
                + "     id = ?";           // 08
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
        preparedStatement.setTimestamp(1, dtEntrega);
        preparedStatement.setTimestamp(2, dtPrevisaoDevolucao);
        preparedStatement.setTimestamp(3, dtDevolucao);
        preparedStatement.setString(4, justificativa);
        preparedStatement.setString(5, observacao);
        preparedStatement.setInt(6, EnumSituacaoHistoricoFerramenta.ConverterEnumNumero(situacao));
        preparedStatement.setInt(7, idFuncionario);
        preparedStatement.setInt(8, id);
        preparedStatement.executeUpdate();
        preparedStatement.close();
    }

    public void deletar() throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getIdentificador() {
        return justificativa;
    }

    public void setIdentificador(String identificador) {
        this.justificativa = identificador;
    }

    public String getNome() {
        return observacao;
    }

    public void setNome(String nome) {
        this.observacao = nome;
    }

    public Timestamp getDtEntrega() {
        return dtEntrega;
    }

    public void setDtEntrega(Timestamp dtEntrega) {
        this.dtEntrega = dtEntrega;
    }

    public Timestamp getDtPrevisaoDevolucao() {
        return dtPrevisaoDevolucao;
    }

    public void setDtPrevisaoDevolucao(Timestamp dtPrevisaoDevolucao) {
        this.dtPrevisaoDevolucao = dtPrevisaoDevolucao;
    }

    public Timestamp getDtDevolucao() {
        return dtDevolucao;
    }

    public void setDtDevolucao(Timestamp dtDevolucao) {
        this.dtDevolucao = dtDevolucao;
    }

    public String getJustificativa() {
        return justificativa;
    }

    public void setJustificativa(String justificativa) {
        this.justificativa = justificativa;
    }

    public String getObservacao() {
        return observacao;
    }

    public void setObservacao(String observacao) {
        this.observacao = observacao;
    }

    public SituacaoHistoricoFerramenta getSituacao() {
        return situacao;
    }

    public void setSituacao(SituacaoHistoricoFerramenta situacao) {
        this.situacao = situacao;
    }

    public int getIdFuncionario() {
        return idFuncionario;
    }

    public void setIdFuncionario(int idFuncionario) {
        this.idFuncionario = idFuncionario;
    }
}
